23512
22083
Dette spørgsmål har allerede svar her:
Ingen implicit konvertering i overbelastet operatør
(2 svar)
Lukket for 7 år siden.
Jeg skriver en simpel indpakning til en elementær type og prøver at undgå at skulle skrive for mange varianter af standardoperatører. Jeg håbede, at implicit typekonvertering ville hjælpe, men det gør det ikke. Her er et afskåret eksempel:
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
Int-operator + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(ugyldigt) (Int (1) + 2); // Bøde
(ugyldigt) (2 + Int (1)); // fejl: ugyldige operander til binært udtryk ('int' og 'Int')
}
Jeg bruger llvm. Den første linje af hovedkompileringer er fin. Den anden forårsager en fejl. Nu, hvad jeg havde håbet ville ske i anden linje, er at 2 implicit konverteres til Int (2) efterfulgt af et opkald til operatør +. Hvorfor sker det ikke? Hvorfor sker den implicitte konvertering i første linje? 
Det sker i første linje, fordi den eneste operatør + tilgængelige er operator + (Int &) (som har en implicit første parameter for Int for denne forekomst). Den anden linje mislykkes, fordi den første parameter er en int, og den har ingen anelse om, at den skal konvertere den, før den forsøger at udføre handlingen (den ved ikke, at den skal bruge Int :: operator +).
Du kan undgå dette problem ved at gøre operatøren til en ikke-ven-venfunktion (http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
ven Int-operatør + (const Int & lhs, const Int & rhs);
};
Int operator + (const Int & lhs, const Int & rhs)
{
returner lhs._i + rhs._i;
}
int main ()
{
Int i;
i + 5;
5 + i;
returnere 0;
}
|
Er det ikke det svar, du leder efter? Gennemse andre spørgsmål mærket c ++ operatør-nøgleord implicit-konvertering eller stil dit eget spørgsmål.